home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / sci / ephem_src_4_28.lha / anomaly.c < prev    next >
C/C++ Source or Header  |  1992-04-17  |  901b  |  44 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "astro.h"
  4.  
  5. #define    TWOPI    (2*PI)
  6.  
  7. /* given the mean anomaly, ma, and the eccentricity, s, of elliptical motion,
  8.  * find the true anomaly, *nu, and the eccentric anomaly, *ea.
  9.  * all angles in radians.
  10.  */
  11. anomaly (ma, s, nu, ea)
  12. double ma, s;
  13. double *nu, *ea;
  14. {
  15.     double m, fea;
  16.  
  17.     m = ma-TWOPI*(long)(ma/TWOPI);
  18.     if (m > PI) m -= TWOPI;
  19.     if (m < -PI) m += TWOPI;
  20.     fea = m;
  21.  
  22.     if (s < 1.0) {
  23.         /* elliptical */
  24.         double dla;
  25.         while (1) {
  26.         dla = fea-(s*sin(fea))-m;
  27.         if (fabs(dla)<1e-6)
  28.             break;
  29.         dla /= 1-(s*cos(fea));
  30.         fea -= dla;
  31.         }
  32.         *nu = 2*atan(sqrt((1+s)/(1-s))*tan(fea/2));
  33.         } else {
  34.         /* hyperbolic */
  35.         double corr = 1;
  36.         while (fabs(corr) > 0.000001) {
  37.           corr = (m - s * sinh(fea) + fea) / (s*cosh(fea) - 1);
  38.           fea += corr;
  39.         }
  40.         *nu = 2*atan(sqrt((s+1)/(s-1))*tanh(fea/2));
  41.     }
  42.     *ea = fea;
  43. }
  44.